#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>

#include "shop.h"
#include "statistics.h"

static void copy_rigth(double *s1, unsigned int size, double *s2, unsigned int from);

int main (int argc, char **argv){
	unsigned int s, S,x,iter,i=0,n_h=0;
	double lambda,l,h;
	double av_sold_prod = 0.0, av_sold_not_prod = 0.0, av_g = 0.0,T=0.0;
	answer res = NULL;
	double *gs = NULL; /*guarda las ganancias de 100 dias*/
	double *geos = NULL; /*guarda las va geometricas de 100 dias*/
	unsigned int a_geos = 0;

	if (argc !=10){
		printf("\
		1st Arg: Int; Numero s\n\
		2st Arg: Int; Numero S\n\
		3nd Arg: Real ; Parametro lambda para llegada de clientes.\n\
		4rd Arg: Int ; Cantidad de stock inicial\n\
		5th Arg: double ; Costo de mantenimiento\n\
		6th Arg: double; Tiempo de espera de un pedido\n\
		7th Arg: int; Simular hasta un tiempo T. Si T=0 se simula la llegada de 1000 clientes.\n\
		8th Arg: int; Cantidad de simulaciones\n\
		9th Arg: int; 1 para un PPNH, 0 caso contrario\n"
		);		
		return 0;
	}
		

	s= atoi(argv[1]);         S = atoi(argv[2]);
	lambda = atof(argv[3]);   x = atoi(argv[4]);
	h = atof(argv[5]);        l =atof(argv[6]);
	T = atof(argv[7]);        iter = atoi(argv[8]);
	n_h = atoi(argv[9]);
	
	printf("\n\n####################### Datos de entrada #######################\n\n");
	printf("\n s:%i  S:%i  lambda:%g  x:%i  h:%g  l:%g  T:%g  iter:%i  n_h:%i\n",s,S,lambda,x,h,l,T,iter,n_h);

	if(iter == 1){
		
		res = shop(s,S,lambda,x,h,l,T,n_h);
		create_hists(res);
		
		printf("\n\n####################### Datos de salida #######################\n\n");
		printf("\nCantidad de clientes: %i\n",res->n);
		printf("\nProductos vendidos: %i\n", res-> sold_prod);
		printf("\nProductos no vendidos: %i\n", res-> sold_not_prod);
		printf("\nGanancia obtenida: %g\n\n", res->g);
		destroy_shop(res);
		
	}
	else{
	  
		gs = calloc(iter,sizeof(double));
		geos = calloc(5*(int)lambda*(int)T*iter, sizeof(double)); /*le doy un valor grande para que quepan todas las geometricas*/
		
		for(i = 0; i < iter; i++){
			res = shop(s,S,lambda,x,h,l,T,n_h);
			gs[i]=res->g;
			av_sold_prod+= res -> sold_prod;
			av_sold_not_prod+= res->sold_not_prod;
			av_g+=res->g;
			a_geos+=res->a_geom;
			copy_rigth(res->geom,res->a_geom ,geos,a_geos - res->a_geom); /*agrupa todas las geometricas en un solo arreglo*/
			destroy_shop(res);
		}
		
		printf("\n\n####################### Datos de salida #######################\n\n");
		printf("Para %i dias:\n", iter);
		printf("\nPromedio de productos vendidos: %g\n", av_sold_prod/(double)iter);
		printf("\nPromedio de productos no vendidos: %g\n", av_sold_not_prod/(double)iter);
		printf("\nPromedio de ganancia obtenida: %g\n", av_g/(double)iter);
		
		print_p_valor_chi_square_geom(geos,a_geos);
		print_estimators(gs, iter);
		create_points(gs, iter);
		print_p_valores_K_S(gs,iter);
		
		free(gs);
		free(geos);
	}
	return 0;
}

static void copy_rigth(double *s1, unsigned int size, double *s2, unsigned int from){
  unsigned int i=0,index = from;
    
  for (i=0; i<size; i++){
      s2[index]=s1[i];
      index++;
  }
}
